package cn.chenyumeng.blog.service.admin.impl;

import cn.chenyumeng.blog.dto.TypeDTO;
import cn.chenyumeng.blog.entity.Type;
import cn.chenyumeng.blog.mapper.TypeMapper;
import cn.chenyumeng.blog.service.admin.TypeService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.Instant;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @program: blog->TypeServiceImpl
 * @description:
 * @author: cg
 * @create: 2020-07-26 23:13
 **/
@Service
public class TypeServiceImpl implements TypeService {

    @Autowired
    private TypeMapper typeMapper;

    @Override
    public List<TypeDTO> queryAll() {
        List<Type> types = typeMapper.queryAll();
        if (types.isEmpty()) {
            return null;
        }
        List<TypeDTO> dtoList = new ArrayList<>();
        types.forEach(type -> {
            TypeDTO dto = new TypeDTO();
            BeanUtils.copyProperties(type, dto);
            dtoList.add(dto);
        });
        return dtoList;
    }

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Transactional
    @Override
    public TypeDTO queryById(Long id) {
        Type type = new Type();
        type.setId(id);
        List<Type> types = typeMapper.queryAllByType(type);
        TypeDTO typeDTO = new TypeDTO();
        BeanUtils.copyProperties(types.get(0), typeDTO);
        return typeDTO;
    }

    /**
     * 查询多条数据
     *
     * @param page 页数
     * @param size 大小
     * @return 对象列表
     */
    @Transactional
    @Override
    public PageInfo<TypeDTO> queryAllByLimit(int page, int size) {
        PageHelper.startPage(page, size);
        List<Type> types = typeMapper.queryAll();
        if (types.isEmpty()) {
            return null;
        }
        PageInfo typePageInfo = new PageInfo(types);
        ArrayList<TypeDTO> list = new ArrayList<>();
        typePageInfo.getList().forEach(type -> {
            TypeDTO dto = new TypeDTO();
            BeanUtils.copyProperties(type, dto);
            list.add(dto);
        });
        typePageInfo.setList(list);
        return typePageInfo;
    }

    /**
     * 新增数据
     *
     * @param typeDTO 实例对象
     * @return 实例对象
     */
    @Transactional
    @Override
    public TypeDTO insert(TypeDTO typeDTO) {
        Type type = new Type();
        // 去重
        if (getTypeByName(typeDTO.getName()) != null) {
            return null;
        }
        typeDTO.setCreateTime(Date.from(Instant.now()));
        typeDTO.setUpdateTime(Date.from(Instant.now()));
        BeanUtils.copyProperties(typeDTO, type);
        typeMapper.insert(type);
        BeanUtils.copyProperties(type, typeDTO);
        return typeDTO;
    }

    /**
     * 修改数据
     *
     * @param typeDTO 实例对象
     * @return 实例对象
     */
    @Transactional
    @Override
    public TypeDTO update(TypeDTO typeDTO) {
        Type type = new Type();
        // 去重
        if (getTypeByName(typeDTO.getName()) != null) {
            return null;
        }
        typeDTO.setUpdateTime(Date.from(Instant.now()));
        BeanUtils.copyProperties(typeDTO, type);
        typeMapper.update(type);
        return queryById(type.getId());
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Transactional
    @Override
    public boolean deleteById(Long id) {
        return typeMapper.deleteById(id) > 0;
    }

    /**
     * 通过分类名称获取分类信息
     *
     * @param name 分类名称
     * @return
     */
    @Override
    public TypeDTO getTypeByName(String name) {
        Type type = new Type();
        type.setName(name);
        List<Type> types = typeMapper.queryAllByType(type);
        if (types.isEmpty()) {
            return null;
        }
        TypeDTO typeDTO = new TypeDTO();
        BeanUtils.copyProperties(types.get(0), typeDTO);
        return typeDTO;
    }

}
